package base_grammar

import "fmt"

/*
&（取地址）和*（根据地址取值）
 Go语言中的值类型（int、float、bool、string、array、struct）都有对应的指针类型，如：*int、*int64、*string等。
*/
func pointer_f1() {
	// 声明int变量
	var a int = 20
	// 声明int类型指针
	var addr *int
	fmt.Printf("addr: %v\n", addr)
	fmt.Printf("addr: %T\n", addr)
	// 取变量a的地址赋给addr
	addr = &a
	fmt.Printf("addr变量的地址是 %v\n", addr)
	fmt.Printf("addr变量的值是 %v\n", *addr)

	// %x 十六进制输出
	fmt.Printf("a变量的地址是 %x\n", &a)
	fmt.Printf("addr变量的地址是 %x\n", addr)
	fmt.Printf("addr变量的地址是 %x\n", &addr)
}

/*
var ptr [MAX]*int; 表示数组里面的元素的类型是int指针类型

*/

const MAX int = 3

func pointer_arr() {
	var a = [MAX]int{1, 2, 3}
	var a_pointer [MAX]*int
	/*
		golang不允许像C语言一样对指针进行运算
		a_pointer = &a
		a_pointer++
	*/
	fmt.Printf("a_pointer: %v\n", a_pointer)
	for i := 0; i < MAX; i++ {
		a_pointer[i] = &a[i]
	}
	fmt.Printf("a_pointer: %v\n", a_pointer)

	for index, v := range a_pointer {
		fmt.Printf("index: %v, value: %v\n", index, *v)
	}

}
